package com.engineering.elink.common.core.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;

import com.engineering.elink.domain.Video;
import com.engineering.elink.vo.ChapterVo;
import com.engineering.elink.vo.VideoVo;
import com.fasterxml.jackson.core.type.TypeReference;
import com.zxy.core.util.JsonBinderUtil;

/**
 * 
 * ClassName: JSONParseUtil <br/> 
 * Function: ADD FUNCTION. <br/> 
 * Reason: ADD REASON(可选). <br/> 
 * date: 2016年11月17日 下午3:39:15 <br/> 
 * 
 * @author zengxinyan 
 * @version  
 * @since JDK 1.8
 */
@SuppressWarnings("rawtypes")
public class JSONParseUtil {
	
	private static Logger logger = Logger.getLogger(JSONParseUtil.class);
	
	/**
	 * 通过jsonObject解析为传入的bean
	 * 
	 * parseToBean:(这里用一句话描述这个方法的作用). <br/> 
	 * (这里描述这个方法适用条件 – 可选).<br/> 
	 * (这里描述这个方法的执行流程 – 可选).<br/> 
	 * (这里描述这个方法的使用方法 – 可选).<br/> 
	 * (这里描述这个方法的注意事项 – 可选).<br/> 
	 * 
	 * @author zengxinyan 
	 * @param jsonObject
	 * @param beanCls
	 * @return 
	 * @since JDK 1.8
	 */
	public static <T> T parseToBean(JSONObject jsonObject, Class<T> beanCls){
		T bean = BeanUtil.newInstanceBean(beanCls);
		
		for (String fieldName : ToolUtil.getAttributes(Arrays.asList(BeanUtil.getBeanFields(beanCls)), "name", String.class)){
			if (jsonObject.has(fieldName)){
				BeanUtil.setBeanField(bean, fieldName, jsonObject.get(fieldName));
			}
		}
		return bean;
	}
	
	/**
	 * 通过jsonArray解析为传入bean的集合
	 * 
	 * parseToList:(这里用一句话描述这个方法的作用). <br/> 
	 * (这里描述这个方法适用条件 – 可选).<br/> 
	 * (这里描述这个方法的执行流程 – 可选).<br/> 
	 * (这里描述这个方法的使用方法 – 可选).<br/> 
	 * (这里描述这个方法的注意事项 – 可选).<br/> 
	 * 
	 * @author zengxinyan 
	 * @param jsonArray
	 * @param beanCls
	 * @return 
	 * @since JDK 1.8
	 */
	public static <T> List<T> parseToList(JSONArray jsonArray, Class<T> beanCls){
		List<T> result = new ArrayList<T>();
		for (int i = 0; i < jsonArray.size(); i++){
			result.add(parseToBean(jsonArray.getJSONObject(i), beanCls));
		}
		return result;
	}
	
	public static <T> T[] parseToArray(JSONArray jsonArray, Class<T> beanCls){
		return ToolUtil.collectionToArray(parseToList(jsonArray, beanCls), beanCls);
	}
	
	@SuppressWarnings("unchecked")
	public static Map parseToMap(JSONObject jsonObject){
		Map result = new HashMap();
		for (Object key : jsonObject.keySet()){
			result.put(key, jsonObject.get(key));
		}
		return result;
	}
	
	public static String format(Object obj){
		return JSONObject.fromObject(BeanUtil.parseBean(obj)).toString();
	}
	
	public static JSONObject formatBean(Object bean){
		return JSONObject.fromObject(bean);
	}
	
	/**
	 * 对象转为JSONArray
	 * formatArray:(这里用一句话描述这个方法的作用). <br/> 
	 * (这里描述这个方法适用条件 – 可选).<br/> 
	 * (这里描述这个方法的执行流程 – 可选).<br/> 
	 * (这里描述这个方法的使用方法 – 可选).<br/> 
	 * (这里描述这个方法的注意事项 – 可选).<br/> 
	 * 
	 * @author zengxinyan 
	 * @param array
	 * @return 
	 * @since JDK 1.8
	 */
	public static JSONArray formatArray(Object array){
		return JSONArray.fromObject(array);
	}
	
	public static JSONArray formatArray(Collection collection){
		return JSONArray.fromObject(collection);
	}
	
	public static JSONArray formatArray(Object[] array){
		return JSONArray.fromObject(array);
	}
	
	public static JSONArray formatArray(Map map){
		return JSONArray.fromObject(map);
	}
	
	
	public static void main(String[] args) throws Exception{
		//0新增
		String jsonStr="[{\"chapterId\":0,\"chapterName\":\"第一章\",\"childChapterList\":[{\"chapterId\":0,\"chapterName\":\"第一节\",\"videoList\":[{\"videoId\":0,\"videoName\":\"第一个视频\"},{\"videoId\":0,\"videoName\":\"第二个视频\"}]},{\"chapterId\":0,\"chapterName\":\"第二节\",\"videoList\":[{\"videoId\":0,\"videoName\":\"第三个视频\"},{\"videoId\":0,\"videoName\":\"第四个视频\"}]}]},{\"chapterId\":0,\"chapterName\":\"第二章\",\"childChapterList\":[{\"chapterId\":0,\"chapterName\":\"第一节\",\"videoList\":[{\"videoId\":0,\"videoName\":\"第一个视频\"},{\"videoId\":0,\"videoName\":\"第二个视频\"}]},{\"chapterId\":0,\"chapterName\":\"第二节\",\"videoList\":[{\"videoId\":0,\"videoName\":\"第三个视频\"},{\"videoId\":0,\"videoName\":\"第四个视频\"}]}]}]";
		
		List<ChapterVo> parentList=JsonBinderUtil.fromJsontolist(jsonStr,new TypeReference<List<ChapterVo>>(){});
		
		logger.info("章的个数为："+parentList.size());

		for(ChapterVo pvo:parentList){
			
			List<VideoVo> childList=pvo.getChildChapterList();
			logger.info("章ID："+pvo.getChapterId()+" 章名称："+pvo.getChapterName()+" 节的个数："+childList.size());
			
			for(VideoVo vo:childList){
				List<Video> videoList=vo.getVideoList();
				
				logger.info("节ID："+vo.getChapterId()+" 节名称："+vo.getChapterName()+" 视频的个数："+videoList.size());
				for(Video video:videoList){
					logger.info("视频ID："+video.getVideoId()+" 视频名称："+video.getVideoName());
				}
			}
		}
		
		
	}
	
	
}